home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-04-03 | 11.7 KB | 434 lines | [TEXT/MPS ] |
- //----------------------------------------------------------------------------------------
- // UObject.cp
- // Copyright © 1984-96 by Apple Computer, Inc. All rights reserved.
- //----------------------------------------------------------------------------------------
-
- #ifndef __UOBJECT__
- #include "UObject.h"
- #endif
-
- // MacApp
-
- #if qDebug || qTheDebugger
- #ifndef __UDEBUG__
- #include "UDebug.h"
- #endif
- #endif
-
- #ifndef __UDEPENDENCIES__
- #include "UDependencies.h"
- #endif
-
- #ifndef __UFAILURE__
- #include "UFailure.h"
- #endif
-
- // StripLong etc.
- #ifndef __UCOREUTILITIES__
- #include "UCoreUtilities.h"
- #endif
-
- // SetPermHandleSize, etc.
- #ifndef __UMEMORY__
- #include "UMemory.h"
- #endif
-
- #ifndef __USTREAM__
- #include "UStream.h"
- #endif
-
- #if qDebug || qTheDebugger
- #ifndef __UTHEDEBUGGER__
- #include "UTheDebugger.h"
- #endif
- #endif
-
- // ANSI
-
- #ifndef __STDIO__
- #include <stdio.h>
- #endif
-
- // Voodoo Monkey
-
- #if qInspector
- #ifndef __NUBINSPECTORHOOKS__
- #include "NubInspectorHooks.h"
- #endif
- #endif
-
- #ifndef qMacApp
- #define qMacApp FALSE
- #endif
-
- //----------------------------------------------------------------------------------------
- // Globals
- //----------------------------------------------------------------------------------------
-
- // pObjectAllocationFlag is set to true in TObject::TObject, and set back to false in
- // TObject::IObject and TObject::ReadFrom. This is used to warn the programmer that forgets
- // to call TObject::IObject or TObject::ReadFrom. Forgetting this means the inspector won't
- // know about the object.
-
- #if qInspector
- static Boolean pObjectAllocationFlag;
- static TObject* pLastObject;
- #endif
-
-
- //========================================================================================
- // CLASS TObject
- //========================================================================================
- #undef Inherited
-
- #pragma segment MAOpen
- MA_DEFINE_CLASS_M0(TObject);
-
- //----------------------------------------------------------------------------------------
- // TObject::TObject:
- //----------------------------------------------------------------------------------------
- #pragma segment ConstructorRes
- // Note that this cannot be inlined without dropping turds all over the place. Probably
- // this is because TObject has a virtual destructor
- void TObject::operator delete(void* obj)
- {
- MAOperatorDelete(obj);
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::TObject:
- //----------------------------------------------------------------------------------------
- #if qInspector
- #pragma segment ConstructorRes
-
- TObject::TObject()
- {
- if (pObjectAllocationFlag)
- {
- CStr255 message(IsObject(pLastObject) ? pLastObject->GetClassName() : "Someone");
-
- message += " forgot to call IObject or ReadFrom!";
-
- fprintf(stderr, "%s\n", (const char*)message);
- }
-
- pObjectAllocationFlag = TRUE; // set the flag
- pLastObject = this;
- }
- #endif
-
- //----------------------------------------------------------------------------------------
- // TObject destructor
- //----------------------------------------------------------------------------------------
- #pragma segment MADestructorRes
-
- TObject::~TObject()
- {
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::Clone:
- //----------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- TObject* TObject::Clone()
- {
- TObject * result = (TObject *)operator new(GetClassSize());
- MABlockMove(this, result, GetClassSize());
-
- #if qTheDebugger
- TheDbgr_Add_Object(result);
- #endif
-
- #if qInspector
- if (NubIsInstalled())
- NubNewObject(this, ClassName(GetClassName()));
- #endif
-
- return result;
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::Free:
- //----------------------------------------------------------------------------------------
- #pragma segment MAObjectRes
-
- void TObject::Free()
- {
- if (RemoveDependenciesOnFree())
- RemoveAllDependencies();
-
- #if qTheDebugger
- TheDbgr_Delete_Object(this);
- #endif
-
- #if qInspector
- if (NubIsInstalled())
- NubObjectFreed(this, ClassName(GetClassName()));
- #endif
-
- delete this;
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::IObject:
- //----------------------------------------------------------------------------------------
- #if qDebug || qSym || qInspector || qTheDebugger
- #pragma segment MAObjectRes
-
- void TObject::IObject()
- {
- #if qDebug || qSym
- fClassID = GetClassID();
- #endif
-
- #if qInspector
- pObjectAllocationFlag = FALSE; // clear the flag
- pLastObject = NULL;
- #endif
-
- #if qTheDebugger
- TheDbgr_Add_Object(this);
- #endif
-
- #if qInspector
- if (NubIsInstalled())
- NubNewObject(this, ClassName(GetClassName()));
- #endif
- }
- #endif
-
- //----------------------------------------------------------------------------------------
- // TObject::Hash:
- //----------------------------------------------------------------------------------------
- #pragma segment MAObjectRes
-
- HashValue TObject::Hash() const
- {
- return (long)this >> 2;
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::IsEqual:
- //----------------------------------------------------------------------------------------
- #pragma segment MAObjectRes
-
- Boolean TObject::IsEqual(const TObject* /* theObject */ ) const
- {
- #if qDebug
- ProgramBreak("You need to override the IsEqual method");
- #endif
-
- return FALSE;
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::CompareObject:
- //----------------------------------------------------------------------------------------
- #pragma segment MAObjectRes
-
- ComparisonResult TObject::CompareObject(const TObject* arg) const
- {
- ComparisonResult returnVal = kEqual;
-
- if (IsLessThan(arg))
- returnVal = kLessThan;
- else if (IsGreaterThan(arg))
- returnVal = kGreaterThan;
-
- return returnVal;
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::IsGreaterThan:
- //----------------------------------------------------------------------------------------
- #pragma segment MAObjectRes
-
- Boolean TObject::IsGreaterThan(const TObject*) const
- {
- #if qDebug
- ProgramBreak("You need to override the IsGreaterThan method");
- #endif
-
- return FALSE;
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::IsLessThan:
- //----------------------------------------------------------------------------------------
- #pragma segment MAObjectRes
-
- Boolean TObject::IsLessThan(const TObject*) const
- {
- #if qDebug
- ProgramBreak("You need to override the IsLessThan method");
- #endif
-
- return FALSE;
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::Changed:
- //----------------------------------------------------------------------------------------
- #pragma segment MAObjectRes
-
- void TObject::Changed(ChangeID theChange,
- TObject* changedBy)
- {
- TDependencySpace * itsDependencySpace = GetDependencySpace();
- if (itsDependencySpace)
- itsDependencySpace->NotifierChanged(this, theChange, changedBy);
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::DoUpdate:
- //----------------------------------------------------------------------------------------
- #pragma segment MAObjectRes
-
- void TObject::DoUpdate(ChangeID /* theChange */,
- TObject* /* changedObject */ ,
- TObject* /* changedBy */ ,
- TDependencySpace* /* dependencySpace */ )
- {
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::GetDependencySpace:
- //----------------------------------------------------------------------------------------
- #pragma segment MAObjectRes
-
- TDependencySpace* TObject::GetDependencySpace()
- {
- return gMacAppDependencies;
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::AddDependent:
- //----------------------------------------------------------------------------------------
- #pragma segment MAObjectRes
-
- void TObject::AddDependent(TObject* dependent)
- {
- TDependencySpace * itsDependencySpace = GetDependencySpace();
- if (itsDependencySpace)
- itsDependencySpace->AddDependency(this, dependent, kNoLabel);
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::RemoveDependent:
- //----------------------------------------------------------------------------------------
- #pragma segment MAObjectRes
-
- void TObject::RemoveDependent(TObject* dependent)
- {
- TDependencySpace * itsDependencySpace = GetDependencySpace();
- if (itsDependencySpace)
- itsDependencySpace->RemoveDependency(this, dependent, kNoLabel);
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::RemoveAllDependencies:
- //----------------------------------------------------------------------------------------
- #pragma segment MAObjectRes
-
- void TObject::RemoveAllDependencies()
- {
- TDependencySpace * itsDependencySpace = GetDependencySpace();
- if (itsDependencySpace)
- itsDependencySpace->RemoveDependencies(this);// Call the routine in UDependencies
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::RemoveDependenciesOnFree:
- //----------------------------------------------------------------------------------------
- #pragma segment MAObjectRes
-
- Boolean TObject::RemoveDependenciesOnFree()
- {
- return TRUE; // By default we always assume we might have dependents
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::IsMarked:
- //----------------------------------------------------------------------------------------
- #pragma segment MAObjectRes
-
- Boolean TObject::IsMarked()
- {
- return FALSE;
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::SetMark:
- //----------------------------------------------------------------------------------------
- #pragma segment MAObjectRes
-
- void TObject::SetMark(Boolean /* state */)
- {
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::GetStandardSignature:
- //----------------------------------------------------------------------------------------
- #pragma segment MAWriteResource
-
- IDType TObject::GetStandardSignature()
- {
- return (GetClassDescDynamic())->GetSignature();
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::ReadFrom:
- //----------------------------------------------------------------------------------------
- #pragma segment MAReadResource
-
- void TObject::ReadFrom(TStream* /* aStream */ )
- {
- #if qDebug || qSym
- fClassID = GetClassID();
- #endif
-
- #if qInspector
- pObjectAllocationFlag = FALSE; // clear the flag
- pLastObject = NULL;
- #endif
-
- #if qTheDebugger
- TheDbgr_Add_Object(this);
- #endif
-
- #if qInspector
- if (NubIsInstalled())
- NubNewObject(this, ClassName(GetClassName()));
- #endif
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::WriteTo:
- //----------------------------------------------------------------------------------------
- #pragma segment MAWriteResource
-
- void TObject::WriteTo(TStream* /* aStream */ )
- {
- }
-
- //----------------------------------------------------------------------------------------
- // TObject::SubClassResponsibility:
- //----------------------------------------------------------------------------------------
- #if qDebugMsg
- #pragma segment MAObjectRes
-
- void TObject::SubClassResponsibility()
- {
- ClassName s;
- GetCallersMethodName(s);
-
- fprintf(stderr, "%s: must be overridden!", (const char*)s);
- }
- #endif
-
- //----------------------------------------------------------------------------------------
- // End of UObject.cp
-
- #pragma segment Inline
-